{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "8f210ec3",
      "metadata": {},
      "source": [
        "# Shell Tool\n",
        "\n",
        "Giving agents access to the shell is powerful (though risky outside a sandboxed environment).\n",
        "\n",
        "The LLM can use it to execute any shell commands. A common use case for this is letting the LLM interact with your local file system."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "f7b3767b",
      "metadata": {
        "tags": []
      },
      "outputs": [],
      "source": [
        "from langchain.tools import ShellTool\n",
        "\n",
        "shell_tool = ShellTool()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "c92ac832-556b-4f66-baa4-b78f965dfba0",
      "metadata": {
        "tags": []
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Hello World!\n",
            "\n",
            "real\t0m0.000s\n",
            "user\t0m0.000s\n",
            "sys\t0m0.000s\n",
            "\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "/Users/wfh/code/lc/lckg/langchain/tools/shell/tool.py:34: UserWarning: The shell tool has no safeguards by default. Use at your own risk.\n",
            "  warnings.warn(\n"
          ]
        }
      ],
      "source": [
        "print(shell_tool.run({\"commands\": [\"echo 'Hello World!'\", \"time\"]}))"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2fa952fc",
      "metadata": {},
      "source": [
        "### Use with Agents\n",
        "\n",
        "As with all tools, these can be given to an agent to accomplish more complex tasks. Let's have the agent fetch some links from a web page."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "851fee9f",
      "metadata": {
        "tags": []
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "\n",
            "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
            "\u001b[32;1m\u001b[1;3mQuestion: What is the task?\n",
            "Thought: We need to download the langchain.com webpage and extract all the URLs from it. Then we need to sort the URLs and return them.\n",
            "Action:\n",
            "```\n",
            "{\n",
            "  \"action\": \"shell\",\n",
            "  \"action_input\": {\n",
            "    \"commands\": [\n",
            "      \"curl -s https://langchain.com | grep -o 'http[s]*://[^\\\" ]*' | sort\"\n",
            "    ]\n",
            "  }\n",
            "}\n",
            "```\n",
            "\u001b[0m"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "/Users/wfh/code/lc/lckg/langchain/tools/shell/tool.py:34: UserWarning: The shell tool has no safeguards by default. Use at your own risk.\n",
            "  warnings.warn(\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "Observation: \u001b[36;1m\u001b[1;3mhttps://blog.langchain.dev/\n",
            "https://discord.gg/6adMQxSpJS\n",
            "https://docs.langchain.com/docs/\n",
            "https://github.com/hwchase17/chat-langchain\n",
            "https://github.com/hwchase17/langchain\n",
            "https://github.com/hwchase17/langchainjs\n",
            "https://github.com/sullivan-sean/chat-langchainjs\n",
            "https://js.langchain.com/docs/\n",
            "https://python.langchain.com/en/latest/\n",
            "https://twitter.com/langchainai\n",
            "\u001b[0m\n",
            "Thought:\u001b[32;1m\u001b[1;3mThe URLs have been successfully extracted and sorted. We can return the list of URLs as the final answer.\n",
            "Final Answer: [\"https://blog.langchain.dev/\", \"https://discord.gg/6adMQxSpJS\", \"https://docs.langchain.com/docs/\", \"https://github.com/hwchase17/chat-langchain\", \"https://github.com/hwchase17/langchain\", \"https://github.com/hwchase17/langchainjs\", \"https://github.com/sullivan-sean/chat-langchainjs\", \"https://js.langchain.com/docs/\", \"https://python.langchain.com/en/latest/\", \"https://twitter.com/langchainai\"]\u001b[0m\n",
            "\n",
            "\u001b[1m> Finished chain.\u001b[0m\n"
          ]
        },
        {
          "data": {
            "text/plain": [
              "'[\"https://blog.langchain.dev/\", \"https://discord.gg/6adMQxSpJS\", \"https://docs.langchain.com/docs/\", \"https://github.com/hwchase17/chat-langchain\", \"https://github.com/hwchase17/langchain\", \"https://github.com/hwchase17/langchainjs\", \"https://github.com/sullivan-sean/chat-langchainjs\", \"https://js.langchain.com/docs/\", \"https://python.langchain.com/en/latest/\", \"https://twitter.com/langchainai\"]'"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from langchain.chat_models import ChatOpenAI\n",
        "from langchain.agents import initialize_agent\n",
        "from langchain.agents import AgentType\n",
        "\n",
        "llm = ChatOpenAI(temperature=0)\n",
        "\n",
        "shell_tool.description = shell_tool.description + f\"args {shell_tool.args}\".replace(\"{\", \"{{\").replace(\"}\", \"}}\")\n",
        "self_ask_with_search = initialize_agent([shell_tool], llm, agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True)\n",
        "self_ask_with_search.run(\"Download the langchain.com webpage and grep for all urls. Return only a sorted list of them. Be sure to use double quotes.\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "8d0ea3ac-0890-4e39-9cec-74bd80b4b8b8",
      "metadata": {},
      "outputs": [],
      "source": []
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3 (ipykernel)",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.8.16"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}
